package br.com.redejava.ciep.negocio;

import java.util.ArrayList;
import java.util.List;

public class Loja extends Unidade {
	private URE ureRegional;
	private List<URE> uresMaisProximas;

	public Loja() {
		this.uresMaisProximas = new ArrayList<URE>();
	}

	public void addUreMaisProxima(URE ureMaisProxima) {
		this.uresMaisProximas.add(ureMaisProxima);
	}

	public List<URE> getUresMaisProximas() {
		return uresMaisProximas;
	}

	public void setUreRegional(URE ureRegional) {
		this.ureRegional = ureRegional;
	}

	public void venderProduto(String produtoNome, Integer quantidade) {
		Integer quantidade_ = quantidade;
		if (quantidade > this.getProduto(produtoNome).getQuantidade()) {
			this.ureRegional.addHistSolicLoja(quantidade);
			this.solicitarQuantidadeURE(produtoNome, Math.abs(this.getProduto(produtoNome).getQuantidade()-quantidade), false);
		};

		quantidade = this.getProduto(produtoNome).subtrairQuantidade(quantidade);

		if (quantidade > Produto.QTD_MIN_PRODUTO) {
			System.out.printf("Erro! Quantidade indisponível: %d\n", quantidade);
		} else {
			System.out.printf("Quantidade [%d x %s] vendido!\n", quantidade_, produtoNome);
		};

		if (this.getProduto(produtoNome).getQuantidade() == Produto.QTD_MIN_PRODUTO) {
			this.ureRegional.addHistSolicLoja(Produto.QTD_MAX_PRODUTO_SOLIC);
			this.solicitarQuantidadeURE(produtoNome, Produto.QTD_MAX_PRODUTO_SOLIC, true);
		};
	}

	public void solicitarQuantidadeURE(String produtoNome, Integer quantidade, Boolean isQuantidadeExtra) {
		this.addHistSolicUnidade(produtoNome, quantidade);

		Integer quantidade_ = quantidade;
		quantidade = this.ureRegional.getProduto(produtoNome).subtrairQuantidade(quantidade);

		if (!isQuantidadeExtra && quantidade == Produto.QTD_MIN_PRODUTO) {
			this.solicitarQuantidadeURE(produtoNome, Produto.QTD_MAX_PRODUTO_SOLIC, true);
		} else if (quantidade > Produto.QTD_MIN_PRODUTO) {
			for(URE ure: this.uresMaisProximas) {
				quantidade -= ure.getProduto(produtoNome).subtrairQuantidade(quantidade);
			};
		};

		if (this.ureRegional.getProduto(produtoNome).getQuantidade() == Produto.QTD_MIN_PRODUTO) {
			this.ureRegional.solicitarQuantidadeURE(produtoNome, this.ureRegional.getMediaSolicitaces(quantidade));
		};

		if (quantidade > Produto.QTD_MIN_PRODUTO) {
			this.solicitarQuantidadeURE(produtoNome, quantidade, false);
		};

		if (quantidade == Produto.QTD_MIN_PRODUTO) {
			this.getProduto(produtoNome).incrementarQuantidade(quantidade_);
		};
	}
}
